package br.ucb.ucblive.managedbean;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import br.ucb.ucblive.HIB.CursoHIB;
import br.ucb.ucblive.HIB.DisciplinaHIB;
import br.ucb.ucblive.HIB.ProfessorHIB;
import br.ucb.ucblive.HIB.UsuarioHIB;
import br.ucb.ucblive.beans.Curso;
import br.ucb.ucblive.beans.Disciplina;
import br.ucb.ucblive.beans.Professor;
import br.ucb.ucblive.beans.Usuario;
import br.ucb.ucblive.recursos.MensagemConfirmacao;


@SessionScoped
@ManagedBean (name="disciplinaManagedBean")
public class DisciplinaManagedBean {
	private Disciplina disciplina;
	private List<Disciplina> disciplinas;
	private DisciplinaHIB disciplinaHib;
	private CursoHIB cursoHib;
	private List<Curso> cursos;
	private List<Professor> professores;
	private Usuario usuarioLogin;
	private UsuarioHIB usuarioHib;
	private String query;
	private MensagemConfirmacao mensagemConfirmacao;
	private boolean disciplinaAlterada;
	
	public DisciplinaManagedBean(){
		setDisciplina(new Disciplina());
		setDisciplinas(new ArrayList<Disciplina>());
		setDisciplinaHib(new DisciplinaHIB());
		setCursoHib(new CursoHIB());
		setQuery(new String());
		setUsuarioHib(new UsuarioHIB());
		setMensagemConfirmacao(new MensagemConfirmacao());
		setUsuarioLogin(usuarioHib.consultar
					   (FacesContext.getCurrentInstance().
						getExternalContext().getUserPrincipal().getName()
						));
		setDisciplinaAlterada(false);
	}

	
	
	public boolean isDisciplinaAlterada() {
		return disciplinaAlterada;
	}



	public void setDisciplinaAlterada(boolean disciplinaAlterada) {
		this.disciplinaAlterada = disciplinaAlterada;
	}



	public MensagemConfirmacao getMensagemConfirmacao() {
		return mensagemConfirmacao;
	}


	public void setMensagemConfirmacao(MensagemConfirmacao mensagemConfirmacao) {
		this.mensagemConfirmacao = mensagemConfirmacao;
	}


	public Disciplina getDisciplina() {
		return disciplina;
	}

	public void setDisciplina(Disciplina disciplina) {
		this.disciplina = disciplina;
	}

	public List<Disciplina> getDisciplinas() {
		return disciplinas;
	}

	public void setDisciplinas(List<Disciplina> disciplinas) {
		this.disciplinas = disciplinas;
	}
	
	public DisciplinaHIB getDisciplinaHib() {
		return disciplinaHib;
	}

	public void setDisciplinaHib(DisciplinaHIB disciplinaHib) {
		this.disciplinaHib = disciplinaHib;
	}
	
	public CursoHIB getCursoHib() {
		return cursoHib;
	}

	public void setCursoHib(CursoHIB cursoHib) {
		this.cursoHib = cursoHib;
	}

	public List<Curso> getCursos() {
		return cursos;
	}

	public void setCursos(List<Curso> cursos) {
		this.cursos = cursos;
	}
	
	public List<Professor> getProfessores() {
		return professores;
	}

	public void setProfessores(List<Professor> professores) {
		this.professores = professores;
	}
	
	public Usuario getUsuarioLogin() {
		return usuarioLogin;
	}

	public void setUsuarioLogin(Usuario usuarioLogin) {
		this.usuarioLogin = usuarioLogin;
	}

	public UsuarioHIB getUsuarioHib() {
		return usuarioHib;
	}

	public void setUsuarioHib(UsuarioHIB usuarioHib) {
		this.usuarioHib = usuarioHib;
	}
	
	public String getQuery() {
		return query;
	}

	public void setQuery(String query) {
		this.query = query;
	}
	
	
	public String insere(){
		disciplinaHib.salvar(disciplina);
		setDisciplina(new Disciplina());
		if(isDisciplinaAlterada()) getMensagemConfirmacao().disciplinaAlterada();
		else getMensagemConfirmacao().disciplinaCriada();
		setDisciplinaAlterada(false);
		return "index.jsf";
	}
	
	public void excluir(ActionEvent evento){
		if((evento.getComponent().getAttributes().get("disciplina")) instanceof Disciplina)
			setDisciplina((Disciplina) evento.getComponent().getAttributes().get("disciplina"));
		disciplinaHib.excluir(disciplina);
		setDisciplinas(new ArrayList<Disciplina>());
		setDisciplina(new Disciplina());
		disciplinas.addAll(disciplinaHib.listar());
		getMensagemConfirmacao().disciplinaExcluida();
	}
	
	public String atualiza(){
		disciplina.setDisciplinaCurso(disciplinaHib.listarCursoByDisciplina(disciplina.getIdDisciplina()));
		disciplina.setDisciplinaProfessor(disciplinaHib.listarProfessorByDisciplina(disciplina.getIdDisciplina()));
		CursoHIB cursoHib = new CursoHIB();
		ProfessorHIB professorHib = new ProfessorHIB();
		cursos = cursoHib.listarOrdemCrescente();
		professores = professorHib.listarOrdemCrescente();
		setQuery(new String());
		setDisciplinaAlterada(true);
		return "/adm/disciplinaForm?faces-redirect=true";
	}
	
	public String populaCursosProfessores(){
		setDisciplina(new Disciplina());
		CursoHIB cursoHib = new CursoHIB();
		ProfessorHIB professorHib = new ProfessorHIB();
		cursos = cursoHib.listarOrdemCrescente();
		professores = professorHib.listarOrdemCrescente();
		return "/adm/disciplinaForm?faces-redirect=true";
	}
	
	/**
	 * M�todo que retorna uma lista de usu�rios
	 * @param query
	 * @return
	 */
	public String listarDisciplinas(){
		setDisciplina(new Disciplina());
		setDisciplinas(new ArrayList<Disciplina>());
		List<Disciplina> disc = new ArrayList<Disciplina>();
		for(Disciplina d : disciplinaHib.listar()) {  
            if(d.getNome().startsWith(query))  
                disc.add(d);  
        }  	
		disciplinas.addAll(disc);
		setQuery(new String());
		return "/adm/disciplinaList?faces-redirect=true";
		
	}
	
	/**
	 * M�todos que retornam a lista de f�runs (disciplinas) pelo curso de cada tipo de usuario
	 * @param query
	 * @return
	 */
	
	public String listarForuns(){
		setDisciplinas(new ArrayList<Disciplina>());
		for(Disciplina d : disciplinaHib.listarDisciplinasByUsuario(usuarioLogin)){
			d.setDisciplinaCurso(disciplinaHib.listarCursoByDisciplina(d.getIdDisciplina()));
			d.setDisciplinaProfessor(disciplinaHib.listarProfessorByDisciplina(d.getIdDisciplina()));
            disciplinas.add(d);  
        }  
		setQuery(new String());  
		cursos = cursoHib.listarCursosByUsuario(usuarioLogin);
		for (Curso c : cursos)
			c.setDisciplinaCurso(cursoHib.listarDisciplinasByCurso(c.getIdCurso()));
	
		return "/alu/forumList?faces-redirect=true";
	}
	
	/**
	 * M�todo que popula os detalhes na listagem de disciplina
	 * @return
	 */
	public void populaDetalhesDisciplina(ActionEvent evento){
		setCursos(new ArrayList<Curso>());
		setProfessores(new ArrayList<Professor>());
		disciplina = (Disciplina) evento.getComponent().getAttributes().get("disciplina");
		for(Curso c : disciplinaHib.listarCursoByDisciplina(disciplina.getIdDisciplina())){
			c.setDisciplinaCurso(cursoHib.listarDisciplinasByCurso(c.getIdCurso()));
			cursos.add(c);
		}
		for(Professor p : disciplinaHib.listarProfessorByDisciplina(disciplina.getIdDisciplina())){
			p.setDisciplinaProfessor(disciplinaHib.listarDisciplinasByProfessor(p.getIdProfessor()));
			professores.add(p);
		}
		disciplina.setDisciplinaCurso(disciplinaHib.listarCursoByDisciplina(disciplina.getIdDisciplina()));
	}
	
	
}
